package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService{
    @Autowired
    private ItemCatMapper itemCatMapper;
    @Override
    public List<ItemCat> getAll() {
        return itemCatMapper.selectList(null);
    }

    @Override
    public List<ItemCat> findItemCatList(Integer level) {
       long startTime=System.currentTimeMillis();
        Map<Integer,List<ItemCat>>map=getMap();
        if (level==1){
            return map.get(0);
        }
        if (level==2){
            return getTwoList(map);
        }
        List<ItemCat>list= getThreeList(map);
        long endTime=System.currentTimeMillis();
        System.out.println("时间为："+(endTime-startTime));
        return list;
    }

    @Override
    @Transactional
    public void updateStatus(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void saveItemCat(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void deleteItemCats(ItemCat itemCat) {
        int level= itemCat.getLevel();
        if (level==3){
            itemCatMapper.deleteById(itemCat.getId());
        }
        if (level==2){
            QueryWrapper<ItemCat>queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("parent_id", itemCat.getId())
                        .or()
                        .eq("id", itemCat.getId());
            itemCatMapper.delete(queryWrapper);
        }
        if (level==1){
            QueryWrapper<ItemCat>queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("parent_id", itemCat.getId());
            List twoIdList=itemCatMapper.selectObjs(queryWrapper);
            queryWrapper.clear();
            queryWrapper.in(twoIdList.size()>0,"parent_id",twoIdList)
                         .or()
                               .eq ("parent_id",itemCat.getId())
                               .or()
                               .eq("id", itemCat.getId() );
            itemCatMapper.delete(queryWrapper);

        }
    }


    private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
     List<ItemCat>oneList= getTwoList(map);
     for (ItemCat oneItemCat:oneList){
         List<ItemCat> twoList = oneItemCat.getChildren();
         if (twoList==null||twoList.size()==0){
             continue;
         }
         for (ItemCat twoItemCat:twoList){
             int parentId=twoItemCat.getId();
             List<ItemCat>threeList=map.get(parentId);
             twoItemCat.setChildren(threeList);
         }
     }
     return oneList;
    }

    private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
       List<ItemCat>oneList= map.get(0);
       for(ItemCat oneItemCat:oneList){
           int parentId= oneItemCat.getId();
           List<ItemCat> twoList=map.get(parentId);
           oneItemCat.setChildren(twoList);
       }
       return oneList;
    }

    private Map<Integer, List<ItemCat>> getMap() {
        Map<Integer,List<ItemCat>>map=new HashMap<>();
        List<ItemCat> list=itemCatMapper.selectList(null);
        for(ItemCat itemCat:list){
            int parentId=itemCat.getParentId();
            if (map.containsKey(parentId)){
                map.get(parentId).add(itemCat);
            }else{
                List<ItemCat>childrenList=new ArrayList<>();
                childrenList.add(itemCat);
                map.put(parentId,childrenList);
            }
        }
        return map;
    }




//    @Override
//    public List<ItemCat> findItemCatList(Integer level) {
//        long startTime=System.currentTimeMillis();
//        QueryWrapper<ItemCat>queryWrapper=new QueryWrapper<>();
//        queryWrapper.eq("parent_id", 0);
//        List<ItemCat>oneList=itemCatMapper.selectList(queryWrapper);
//        for (ItemCat oneItemCat:oneList){
//            queryWrapper.clear();
//            queryWrapper.eq("parent_id", oneItemCat.getId());
//            List<ItemCat>twoList=itemCatMapper.selectList(queryWrapper);
//
//            for (ItemCat twoItemCat:twoList){
//               queryWrapper.clear();
//               queryWrapper.eq("parent_id", twoItemCat.getId() );
//               List<ItemCat>threeList=itemCatMapper.selectList(queryWrapper);
//               twoItemCat.setChildren(threeList);
//           }
//            oneItemCat.setChildren(twoList);
//
//        }
//        long endTime=System.currentTimeMillis();
//        System.out.println("程序耗时："+(endTime-startTime));
//        return oneList;
//    }
}
